#ifndef _VL_FLAG__H_
#define _VL_FLAG__H_

#include <set>
#include <string>
#include "prop/vl_prop_inc.h"

namespace VL {

/**
 * @Author: CimZzz
 * @Date: 2022-10-25 16:53:51
 * 
 * VL 编译标志对象
 * 
 * 重载加法运算, 实现对标志位的添加
 * 
 * 内部维护一个 set, 用来筛选重复的标志位
 */
class VLFlag {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 16:55:30
	 * 
	 * 构造函数
	 * 
	 * @param separator 拼接字符串的分隔符
	 */
	explicit VLFlag(const std::string& separator = " ");

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:39:02
	 * 
	 * 构造函数
	 * 构造标志实例, 并指定第一个标志
	 * 
	 * @param flag 字符串标志
	 * @param separator 拼接字符串的分隔符
	 */
	explicit VLFlag(const char * flag, const std::string& separator);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:39:02
	 * 
	 * 构造函数
	 * 构造标志实例, 并指定第一个标志
	 * 
	 * @param flag 字符串标志
	 * @param separator 拼接字符串的分隔符
	 */
	explicit VLFlag(const std::string& flag, const std::string& separator);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:39:02
	 * 
	 * 构造函数
	 * 构造标志实例, 并指定标志对象作为初始化
	 * 
	 * @param flagObj 标志对象
	 * @param separator 拼接字符串的分隔符
	 */
	explicit VLFlag(const VLFlag& flagObj, const std::string& separator);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:39:02
	 * 
	 * 构造函数
	 * 构造标志实例, 并指定标志对象作为初始化
	 * 
	 * @param propPtr 属性指针
	 * @param separator 拼接字符串的分隔符
	 */
	explicit VLFlag(const std::shared_ptr<VLProp>& propPtr, const std::string& separator);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:20:53
	 * 
	 * 重载等号运算
	 * 
	 * @param flag 标志
	 */
	void operator =(const std::string& flag);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:21:20
	 * 
	 * 重载等号运算
	 * 
	 * @param flag 标志
	 */
	void operator =(const char * flag);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:21:47
	 * 
	 * 重载等号运算
	 * 
	 * @param flagObj 标志对象
	 */
	void operator =(const VLFlag& flagObj);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:21:47
	 * 
	 * 重载等号运算
	 * 
	 * @param propPtr 属性指针
	 */
	void operator =(const std::shared_ptr<VLProp>& propPtr);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 16:56:32
	 * 
	 * 重载加法运算
	 * 
	 * @param flag 标志
	 * 
	 * @return 当前对象
	 */
	VLFlag& operator +(const std::string& flag);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 16:56:32
	 * 
	 * 重载加法运算
	 * 
	 * @param flag 标志
	 * 
	 * @return 当前对象
	 */
	VLFlag& operator +(const char* flag);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 16:56:32
	 * 
	 * 重载加法运算
	 * 
	 * @param flagObj 标志对象
	 * 
	 * @return 当前对象
	 */
	VLFlag& operator +(const VLFlag& flagObj);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 16:56:32
	 * 
	 * 重载加法运算
	 * 
	 * @param propPtr 属性指针
	 * 
	 * @return 当前对象
	 */
	VLFlag& operator +(const std::shared_ptr<VLProp>& propPtr);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:17:03
	 * 
	 * 重载加等运算
	 * 
	 * @param flag 标志
	 */
	void operator +=(const char * flag);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:17:03
	 * 
	 * 重载加等运算
	 * 
	 * @param flag 标志
	 */
	void operator +=(const std::string& flag);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:17:03
	 * 
	 * 重载加等运算
	 * 
	 * @param flagObj 标志对象
	 */
	void operator +=(const VLFlag& flagObj);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:17:03
	 * 
	 * 重载加等运算
	 * 
	 * @param propPtr 属性指针
	 */
	void operator +=(const std::shared_ptr<VLProp>& propPtr);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:36:13
	 * 
	 * 判断当前标志是否为空
	 */
	bool empty() const;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 18:27:50
	 * 
	 * 转换为属性对象指针
	 * 
	 * @return 属性对象指针
	 */
	std::shared_ptr<VLProp> asProp();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:25:49
	 * 
	 * 将拼接后的字符串转换为字符串常量
	 * 
	 * @return 字符串常量
	 */
	inline const char * c_str() const {
		return this->flagStr.c_str();
	}

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:08:04
	 * 
	 * 拼接后的字符串
	 */
	std::string flagStr;

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:08:46
	 * 
	 * 拼接标志字符串
	 * 
	 * @param flag 标志
	 */
	void concatFlag(const std::string& flag);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 16:55:59
	 * 
	 * 唯一集合
	 */
	std::set<std::string> uniqueSet;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-25 17:11:16
	 * 
	 * 分隔字符串
	 */
	std::string separator;
};


}

#endif // _VL_FLAG__H_
